/*
 * Las bodas de oro de Unix:
 *
 * El tiempo Unix es la medición en segundos del tiempo transcurrido
 * desde el 1 de enero de 1971 a las 00:00:00. Ésta manera de
 * representación decimal se utiliza universalmente en sistemas
 * operativos estilo Unix y en muchos otros para simplificar las
 * operaciones temporales. No sólo permite conocer la fecha actual
 * sino que es súmamente útil para realizar cálculos, especialmente
 * sumas y restas, entre fechas.
 *
 * El número áureo o número de oro Φ (fi) es un número irracional
 * aproximadamente igual a 1,61803398875... al que se le atribuye
 * una importancia mística que lo relaciona con lo divino. A los
 * objetos cuyas medidas respetan la razón áurea se les otorga un
 * carácter estético especial. A lo largo de la historia, se le ha
 * atribuido cierta importancia, objetable, en diversas obras de
 * arquitectura y otras artes.
 *
 * El código C que presento a continuación se encarga de calcular
 * el tiempo en formato calendario sexagesimal de la parte entera
 * del número áureo seguido de sus nueve primeros decimales. Es
 * decir calcula qué fecha será cuando hayan transcurrido 1618033988
 * segundos desde el 1 de enero de 1971 a las 00:00:00. Como
 * resultado se obtiene que el tiempo áureo de Unix es el 10/04/2021
 * a las 02:53:08 con lo cual en esa fecha se cumplirían sus bodas
 * de oro.
 *
 * Referencias:
 *
 * Se puede encontrar más información en español acerca del tiempo
 * Unix en http://es.wikipedia.org/wiki/Tiempo_Unix. En
 * http://en.wikipedia.org/wiki/Unix_time está el texto original
 * en inglés con información adicional. En
 * http://es.wikipedia.org/wiki/N%C3%BAmero_%C3%A1ureo se puede
 * encontrar información en español del número áureo.
 */

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>

void
print_time (const char *prefix, time_t epoch)
{
 	struct tm time_struct;
	char *buffer;

 	time_struct = *localtime (&epoch);
	buffer = (char *) malloc (sizeof (char) * 20);
	strftime (buffer, 20, "%d/%m/%Y %H:%M:%S", &time_struct);
	printf ("%s %s (%ld).\n", prefix, buffer, (long) epoch);
	free (buffer);
}

int
main (int argc, const char *argv[])
{
	double phi = (1.0 + sqrt (5.0)) / 2.0;
	time_t now = time (NULL);
	time_t gold = (time_t) trunc (phi * pow (10.0, 9.0));

 	printf ("El tiempo áureo de Unix:\n\n");

	if (now == -1)
		perror ("No se pudo determinar la hora actual");
	else
		print_time ("La fecha y hora actual es", now);

	if (gold > now)
	{
 		print_time ("La fecha y hora de oro será el", gold);
	 	printf ("\nFaltan %ld segundos.\n", (long) gold - now);
	}
	else
	{
 		print_time ("La fecha y hora de oro fué el", gold);
	 	printf ("\nPasaron %ld segundos.\n", (long) now - gold);
	}

	return EXIT_SUCCESS;
}
